/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cardumen2d;

import control.Cardumen;
import control.GeneradorStandardMinimo;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;

/**
 *
 * @author jorgeorm
 */
public class CanvasPecera extends Canvas implements Runnable{
    
    private int WIDTH, HEIGHT, VELOCIDAD;
    private BufferedImage bi_fondo;
    private Random generador;
    
    private ArrayList<PezCardumen> pecesCardumen;
    
    /*TODO: Esto como que luego se va a pasar a una clase que solo maneje los peces
     */
    private ArrayList<BufferedImage>pezArriba;
    private ArrayList<BufferedImage>pezAbajo;
    private ArrayList<BufferedImage>pezDerecha;
    private ArrayList<BufferedImage>pezIzquierda;
    private BufferStrategy estrategia;
    private boolean flagDetencion;
    private Cardumen cardumen;
    

    public CanvasPecera(int width, int height) {
//        System.out.println("CanvasPecera()");
        WIDTH = width; HEIGHT = height;
        VELOCIDAD = 20;
        generador = new Random((int)System.currentTimeMillis());
        cargarImagenesPeces();
        limpiarBuffer();
        
    }
    
    public void setVelocidad(int velo){
        VELOCIDAD = velo;
    }
    
    public BufferedImage cargarImagen(String nombre){
        URL url = null;
        try{
            url = getClass().getClassLoader().getResource(nombre);
            return ImageIO.read(url);
        }catch(IOException ex){
            System.out.println("No se pudo cargar la imágen "+nombre+" de "+url);
            System.out.println("el error fue: ");
            Logger.getLogger(CanvasPecera.class.getName( )).log(Level.SEVERE, null, ex);
            return null;
        }
    }
    
    @Override
    public void repaint(){
//        System.out.println("repaint()");
        this.paint(this.getGraphics());
    }
    
    @Override
    public void paint(Graphics g){
        super.paint(g);
//        System.out.println("Paint()");
        pintarPecera();
    }
    
    public void almacenarPintada(){
        
    }
    
    private void limpiarBuffer(){
        bi_fondo = cargarImagen("img/fondoPecera.jpg");
//        System.out.println("LimpiarBuffer()");
    }
    
    public void pintarPecera(){
//        Graphics buffer = bi_fondo.getGraphics();
        if (estrategia == null){
            createBufferStrategy( 3 );
            estrategia = getBufferStrategy();
        }
        
        Graphics buffer = estrategia.getDrawGraphics();
        buffer.drawImage(bi_fondo, 0, 0, WIDTH, HEIGHT, this);
        estrategia.show();
    }
    
    private void cargarImagenesPeces(){
        pezAbajo = new ArrayList(3);
        pezArriba = new ArrayList(3);
        pezDerecha = new ArrayList(3);
        pezIzquierda = new ArrayList(3);
        
        pezAbajo.add(cargarImagen("img/pez/abajo1.gif"));
        pezAbajo.add(cargarImagen("img/pez/abajo2.gif"));
        pezAbajo.add(cargarImagen("img/pez/abajo3.gif"));
        
        pezArriba.add(cargarImagen("img/pez/arriba1.gif"));
        pezArriba.add(cargarImagen("img/pez/arriba2.gif"));
        pezArriba.add(cargarImagen("img/pez/arriba3.gif"));
        
        
        pezDerecha.add(cargarImagen("img/pez/derecha1.gif"));
        pezDerecha.add(cargarImagen("img/pez/derecha2.gif"));
        pezDerecha.add(cargarImagen("img/pez/derecha3.gif"));
        
        pezIzquierda.add(cargarImagen("img/pez/izquierda1.gif"));
        pezIzquierda.add(cargarImagen("img/pez/izquierda2.gif"));
        pezIzquierda.add(cargarImagen("img/pez/izquierda3.gif"));
    }
    
    public void actualizarPecera(){
        limpiarBuffer();
        
        Graphics graficas = bi_fondo.getGraphics();
        BufferedImage imagenPez = null;
        
        for (Iterator<PezCardumen> it = pecesCardumen.iterator(); it.hasNext();) {
            PezCardumen pezCardumen = it.next();
            /*Actualización Lógica
             */
//            pezCardumen.moverPez(4);
            
            /*Actualización Gráfica
             */
            imagenPez = getImagenPez(pezCardumen.getImagenPez(), pezCardumen.getSentido());
            graficas.drawImage(imagenPez, pezCardumen.getX_pez(), pezCardumen.getY_pez(), this);
        }
        
        /*TODO: REMOVER!!! TEMPORAL PARA EL MOVIMIENTO DEL PEZ*/
        
    }
    
    public BufferedImage getImagenPez(int idImagen, int sentido){
        BufferedImage imagenPez = null;
        switch(sentido){
                case 0:
                    imagenPez = pezIzquierda.get(idImagen);
                    break;
                case 1: 
                    imagenPez = pezArriba.get(idImagen);
                    break;
                case 2: 
                    imagenPez = pezDerecha.get(idImagen);
                    break;
                case 3: 
                    imagenPez = pezDerecha.get(idImagen);
                    break;
                case 4:
                    imagenPez = pezDerecha.get(idImagen);
                    break;
                case 5: 
                    imagenPez = pezAbajo.get(idImagen);
                    break;
                case 6: 
                    imagenPez = pezIzquierda.get(idImagen);
                    break;
                case 7: 
                    imagenPez = pezIzquierda.get(idImagen);
                    break;
            }
        return imagenPez;
    }
    
    public void iniciarCardumen(int tamanoCardumen){
        pecesCardumen = new ArrayList();
        
        for(int i=0; i<tamanoCardumen; i++){
            pecesCardumen.add(new PezCardumen(WIDTH+200, HEIGHT+8, generador));
        }
        
        cardumen = new Cardumen(WIDTH+200, HEIGHT+200, pecesCardumen);
    }
    
    public void detener(){
        flagDetencion = true;
    }

    @Override
    public void run() {
        flagDetencion=false;
        
        INICIO:while(!flagDetencion){
            cardumen.iterarCardumen();
            actualizarPecera();
            pintarPecera();
            try{
                Thread.sleep(VELOCIDAD);
            }catch(InterruptedException excp){
                System.out.println("Hubo una interrupción en el cardumen");
            }
        }
    }
}
